package com.xianyun.site.iblog.domain.user.model;

import com.alibaba.cola.domain.Entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xianyun.common.core.utils.DateToolUtils;
import lombok.Data;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 用户
 * TODO 根据任务进度 和业务需求 实现 排名 阅读量总和 等功能
 * @author mac_zyj
 */
@Data
@Entity
public class SystemUser {
    private static final long serialVersionUID = 1L;

    /** 主键 */
    private Long id;

    /** 用户ID(随机生成) */
    private Long userId;

    /** 唯一地址 */
    private String uniquePath;

    /** 用户名 */
    private String userName;

    /**上一个用户名*/
    private String lastUserName;

    /** 邮箱 */
    private String email;

    /** 手机号 */
    private String mobile;

    /** 头像 */
    private String avatar;

    /** 用户实际名称 */
    private String userTrueName;

    /** 用户昵称 */
    private String userNickName;

    /** 生日 */
    private Date birthday;

    /** 密码 */
    private String password;

    /** 位置（中国 江苏 南京） */
    private String area;

    /** 个签 */
    private String lottery;

    /** 职位 */
    private String position;

    /** 行业 */
    private String industry;

    /** 开始工作时间 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startWorkTime;

    /** 公司 */
    private String company;

    /** 学历 */
    private String education;

    /**账号状态*/
    private Integer countStatus;

    /**账号创建时间*/
    private Date createTime;

    /**该用户关联的三方用户*/
    private List<SocialUser> socialUsers;

    /**用户登录记录 默认查找 7天 可以根据业务拓展查找范围*/
    private List<LoginHistory> loginHistories;

    /**
     * 获取工作年龄
     * @return 工作年数
     */
    public Long getWorkingYears(){
        String startWorkTime = DateToolUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",this.startWorkTime);
        return  ChronoUnit.YEARS.between(DateToolUtils.getDateTimeTo(startWorkTime), DateToolUtils.getDateTimeTo(DateToolUtils.getTime()));
    }

    public List<String> getMainLoginDevice(){
        return new ArrayList<>(5);
    }

    public List<String> getMainlyLoginLocations(){
        //TODO 实现常住地算法 最多3个
        List<String> mainlyLocations =new ArrayList<>(5);
        if (null != loginHistories && loginHistories.size()>0){
            Map<String, Integer> map = new LinkedHashMap<>(this.loginHistories.size()/2);
            this.loginHistories.stream().sorted(Comparator.comparing(LoginHistory::getLoginTime,Comparator.reverseOrder())).forEach(
                    loginHistory -> {
                        String realAddress = loginHistory.getRealAddress();
                        if(map.containsKey(realAddress)){
                            Integer count= map.get(realAddress);
                            count++;
                            map.put(realAddress, count);
                        }else {
                            map.put(realAddress, 1);
                        }
                    }
            );
            Map<String,Integer> result = map.entrySet().stream()
                    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                            (oldValue, newValue) -> oldValue, LinkedHashMap::new));
            mainlyLocations.addAll(result.keySet());
            return mainlyLocations.subList(0,3);
        }
        return new ArrayList<>(5);
    }
}
